跳到主要内容

JZ27 字符串的排列

https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7

import java.util.ArrayList;
import java.util.Collections;

public class Solution {
public ArrayList<String> Permutation(String str) {
if (str == null || str.equals("")) return null;
ArrayList<String> result = new ArrayList<String>();
fun(str.toCharArray(), result, 0);
// 按字典序排序
Collections.sort(result);
return result;
}

// 这个 cur 标识当前处于第几层
void fun(char[] arr, ArrayList<String> result, int cur) {
// 当 cur == arr.length - 1 时表示当前已经到子串尾部了
if (cur == arr.length - 1) {
String temp = new String(arr);
if (!result.contains(temp)) {
result.add(temp);
}
return;
}

for (int i = cur; i < arr.length; i++) {
// 递归调用swap交换前后两个字符,在最后交换完成入List之后再交换回来,
// 回到初始状态再进下一个循环
swap(arr, cur, i);
fun(arr, result, cur + 1);
swap(arr, cur, i);
}


}

void swap(char[] str, int i, int j) {
if (i != j) {
char t = str[i];
str[i] = str[j];
str[j] = t;
}
}
}